import axios from 'axios'
import qs from 'qs'
import { getToken } from '@/utils/auth'
import { Message } from 'element-ui'

window.__axiosCancelTokenArr = []
// 创建一个 axios 实例
const instance = axios.create({
  baseURL: window.ipConfig.api,
  timeout: 300000
})

// 请求拦截器
instance.interceptors.request.use(
  config => {
    config.headers = config.headers || {}
    let token = getToken()
    if (token) Object.assign(config.headers, { 'X-Access-Token': token })
    config.cancelToken = new axios.CancelToken(cancel => {
      window.__axiosCancelTokenArr.push({ cancel })
    })
    return config
  },
  err => {
    return Promise.reject(err)
  }
)

// 添加响应拦截器
instance.interceptors.response.use(
  response => {
    return response
  },
  function(error) {
    Message.error('后端接口连接失败！')
    return Promise.reject(error)
  }
)

/**
 * 使用es6的export default导出了一个函数，导出的函数代替axios去帮我们请求数据，
 * 函数的参数及返回值如下：
 * @param {String} method  请求的方法：get、post、delete、put
 * @param {String} url     请求的url:
 * @param {Object} data    请求的参数
 * @returns {Promise}     返回一个promise对象，其实就相当于axios请求数据的返回值
 */
export default (method, url, data = null, blob = 'json') => {
  method = method.toLowerCase()
  switch (method) {
    case 'post':
      return instance.post(
        url,
        Object.assign(data, {
          paramsSerializer: params => {
            return qs.stringify(params, { arrayFormat: 'repeat' })
          }
        })
      )
      break
    case 'get':
      return instance.get(url, {
        params: data,
        paramsSerializer: params => {
          return qs.stringify(params, { arrayFormat: 'repeat' })
        },
        responseType: blob
      })
      break
    case 'delete':
      return instance.delete(url, { params: data })
      break
    case 'put':
      return instance.put(url, data)
      break
    default:
      console.log('未知的method--' + method)
      return false
  }
}
